﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using DataAccessLayer;
using DTO;
using System.Configuration;

namespace DAL
{
    public class BaiVietDAL
    {
        private DBManager _dbmanager;

        #region Phương thức khởi tạo mặc định

        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public BaiVietDAL()
        {
            string _connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            _dbmanager = new DBManager(DataProvider.SqlServer, _connectionInfo);
        }
        #endregion

        #region Phương thức tạo 1 bài viết từ Data Reader
        /// <summary>
        /// Phương thức tạo 1 bài viết từ Data Reader
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        private BaiVietDTO CreateBaiVietFromReader(IDataReader reader)
        {
            BaiVietDTO _bvDTO = new BaiVietDTO();
            _bvDTO.MaBaiViet = Convert.ToInt32(reader["MaBaiViet"]);
            _bvDTO.MaNhanVien = reader["MaNhanVien"].ToString();
            _bvDTO.TieuDe = reader["TieuDe"].ToString();
            _bvDTO.NoiDung = reader["NoiDung"].ToString();
            _bvDTO.NgayDang = Convert.ToDateTime(reader["NgayDang"]);
            _bvDTO.MaLoaiBaiViet = Convert.ToInt32(reader["MaLoaiBaiViet"]);
            return _bvDTO;
        }
        #endregion

        #region Phương thức lấy toàn bộ thông tin bài viết
        /// <summary>
        /// Phương thức lấy toàn bộ thông tin bài viết
        /// </summary>
        /// <returns></returns>
        public List<BaiVietDTO> GetListBaiViet()
        {
            List<BaiVietDTO> _lst = new List<BaiVietDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getListBaiViet");
                while (_reader.Read())
                    _lst.Add(this.CreateBaiVietFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;
            
        }
        #endregion

        #region Lấy danh sách bài viết theo mã thể loại
        
        /// <summary>
        /// Lấy danh sách bài viết theo mã thể loại
        /// </summary>
        /// <param name="maloaibaiviet">int</param>
        /// <returns>List</returns>
        public List<BaiVietDTO> GetListBaiVietTheoMaLoaiBaiViet(int maloaibaiviet)
        {
            List<BaiVietDTO> _lst = new List<BaiVietDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_lbv", maloaibaiviet);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getListBaiVietTheoMaLoaiBaiViet");
                while (_reader.Read())
                    _lst.Add(this.CreateBaiVietFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;

        }
        #endregion

        #region Phương thức lấy thông tin 1 bài viết dựa vào mã bài viết
        /// <summary>
        /// Phương thức lấy thông tin 1 bài viết dựa vào mã bài viết
        /// </summary>
        /// <param name="mabv"></param>
        /// <returns></returns>
        public BaiVietDTO GetBaiViet(int mabv)
        {

            BaiVietDTO _bvDTO = new BaiVietDTO();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_bv", mabv);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getBaiViet");
                while (_reader.Read())
                    _bvDTO = this.CreateBaiVietFromReader(_reader);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _bvDTO;
            
        }
        #endregion

        #region Phương thức thêm 1 bài viết
        /// <summary>
        /// Phương thức thêm 1 bài viết
        /// </summary>
        /// <param name="bv"></param>
        /// <returns></returns>
        public int Them(BaiVietDTO bvDTO)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(5);         
                //_dbmanager.AddParameters(0, "@ma_bv", bv.MaBaiViet);
                _dbmanager.AddParameters(0, "@ma_nv", bvDTO.MaNhanVien);
                _dbmanager.AddParameters(1, "@tieude", bvDTO.TieuDe);
                _dbmanager.AddParameters(2, "@noidung", bvDTO.NoiDung);
                _dbmanager.AddParameters(3, "@ngaydang", bvDTO.NgayDang);
                _dbmanager.AddParameters(4, "@ma_lbv", bvDTO.MaLoaiBaiViet);

                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_ThemBaiViet");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức sửa thông tin 1 bài viết
        /// <summary>
        /// Phương thức sửa thông tin 1 bài viết
        /// </summary>
        /// <param name="bv"></param>
        /// <returns></returns>
        public int Sua(BaiVietDTO bvDTO)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(6);
                _dbmanager.AddParameters(0, "@ma_bv", bvDTO.MaBaiViet);
                _dbmanager.AddParameters(1, "@ma_nv", bvDTO.MaNhanVien);
                _dbmanager.AddParameters(2, "@tieude", bvDTO.TieuDe);
                _dbmanager.AddParameters(3, "@noidung", bvDTO.NoiDung);
                _dbmanager.AddParameters(4, "@ngaydang", bvDTO.NgayDang);
                _dbmanager.AddParameters(5, "@ma_lbv", bvDTO.MaLoaiBaiViet);

                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_CapNhatBaiViet");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức xóa 1 bài viết
        /// <summary>
        /// Phương thức xóa 1 bài viết
        /// </summary>
        /// <param name="bv"></param>
        /// <returns></returns>
        public int Xoa(BaiVietDTO bv)
        {
            int index = -1;
            try
            { 
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_bv", bv.MaBaiViet);
                index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_XoaBaiViet");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return index;

        }
        #endregion

    }
}